<?php
/**
 * Controller_Base
 *
 * Класс Controller_Base отвечает за базовую работу всех контроллеров
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
abstract class Controller_Base {

	// Стандартные атрибуты. Используются во все проектах
  protected $showAnalytics = true; // Флаг, выводить или нет код гугл-аналитикс
  protected $isPrint = false; // Флаг, является ли данная страница страницей для печати
  protected $title = ''; // Мета-тайтл страницы
	protected $pageHead = ''; // Главный заголовок страницы
	protected $bodyAttrs = ''; // атрибуты тега body
	protected $keywords = null; // мета-ключевые слова
	protected $description = null; // мета-описание
	protected $pageDescription = null; // Описание страницы - стандартно выводится под заголовком страницы
	protected $pageSeo = null; // Описание страницы для СЕО
	protected $isNoIndex = false;
	protected $arrCss = array(
			'bootstrap.css',
			'interface.css'
	);
	
	protected $arrJs = array(
	); // список подключаемых js-файлов
	
	protected $arrRequest = array(); // Массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	protected $jsReady; // JS-код, который будет автоматически вызван при загрузке страницы
	protected $arrAdditional = array(); // в этом массив можно вносить строки любых мета-тегов. Он будет выведен внутри элемента haed
	protected $showUserMessagesInStandardPlace = false; // Флаг, определяющий выводить ли системные сообщения о выполнении действий пользователю в стандартном месте
	protected $arrUserVars = array(); // Хранилище для пользовательских переменных. Например, для флагов свернуто/развернуто
  protected $showLeftColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  protected $showRightColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  // Атрибуты, связанные с постраничным выводом
  protected $pageLimit = 20;            // Кол-во элементов на страницу
  protected $editLimit = 10;						// Кол-во элементов при редаактировании
  protected $id = 0;										// Текущий элемент
  protected $pageNum = 1;               // Текущая страница
  protected $elementsInListAmount = 0;  // Количество элементов в списке для постраничного вывода
  protected $pageUrlsInGet = true;      // Номер страницы передавать в GET
  protected $isPageInUrl = false;       // Номер страницы уже фигурирует в URL. Требуется только тогда, когда $pageUrlsInGet == false
  protected $editUrl = null;            // Ссылка на редактирование. Если ее задать в заголовке автоматически появится "ред."
  protected $addUrl = null;							// Ссылка на добавление. Если ее задать в заголовке автоматически появится "Добавить"
  protected $mainActionHtml = null;     // HTML код основной ссылки - будут вставляться в div с float right в основном заголовке
  public	$error = 0;
  protected $showLeftMenu = true; 			// выводить левое меню или нет
  protected $showCrumbsInStandardPlace = true; // Флаг, определяющий, выводить ли хлебные крошки в стандартном месте
  protected $showCrumbsInContent = false; // Флаг, определяющий, выводить ли хлебные крошки внутри контента
  protected $ifLastCrumbIsLink = false; // Флаг, определяющий, выводить ли хлебные крошки в стандартном месте
  protected $arrCrumbs = array();
  protected $language = 'rus';
	public 		$data = array(); 						// Массив с данными которые могу использовать любые методы контроллера
	public 		$showPrebasement = false; 
	public 		$version; 									// Версия сайта (main, mobile, api)
	protected $canonical = null; 					// Канонический адрес страницы
	protected $callBackFunction;
	protected $callBackValue;
	protected $beforeFunction;
	protected $beforeAll;
	protected $cssJsDescription = 'css_js.php';
	protected $cssExclude = array();
	protected $transaction = null; 				// Код транзакции для аналитики
	protected $bodyControllerName = null;	// Название текущего контроллера. Подставлятся в body class="_..." Используется клиентской частью для определения, где мы находимся.
	protected $bodyActionName = null; 		// Название текущего действия (action). Подставлятся в body class="__..." Используется клиентской частью для определения, где мы находимс.
	protected $bodyClass = null; // указываем атрибут class для тега body
	protected $showAppleAppSmartBanner = true;
	protected $arrOstProperties = array();
	protected $_arrGaParams = array();
	protected $_alternativeLangUrl = null;
	
	/** 
	 * содержит описание для поисковиков о сущности
	 * @var Microdata_Base 
	 */
	protected $objMicroData = null;
  
	/**
	 * Конструктор контроллера
	 *
	 * @param array $arrRequest - массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	 */
	public function __construct(&$arrRequest) {
	  Service_Debug::setDebug();
	  	
		$this->arrRequest = &$arrRequest;
		$this->pageNum = isset($_GET['p']) ? abs(intval($_GET['p'])) : 1; //номер страницы в листалке
		
		// Ставим куки для проверки сессий
		//$this->_checkSessions();
		
	}

	/**
	 * Выбираем действие в зависимости от URL в $this->arrRequest (Переопределяется в наследуемых классах)
	 *
	 */
	public function action() {
		throw new Exception_SiteError('', 404);
	}
	
	public function makeCurrenciesConversionHash() {
	  $this->addJs('specific/currency.RUB.js?' . filemtime(ABSPATH . 'content/js/specific/currency.RUB.js'));
	}
	
	/**
	 * Метод выводит метаданные
	 *
	 */
	public function showMetas() {
	  if (empty($this->bodyControllerName)) $this->bodyControllerName = strtolower(str_replace('Controller_', '', get_class($this)));
	  $language = Service_Translate::getLang();
		?><?php if(!isset($_SERVER['HTTP_USER_AGENT']) || strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') === FALSE) echo '<!DOCTYPE html>' ?>
<!--[if lt IE 7 ]> <html class="ie ie6 ie-pre9"> <![endif]-->
<!--[if IE 7 ]> <html class="ie ie7 ie-pre9"> <![endif]-->
<!--[if IE 8 ]> <html class="ie ie8 ie-pre9"> <![endif]-->
<!--[if IE 9 ]> <html class="ie ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="<?php echo $language; ?>" xmlns:fb="//www.facebook.com/2008/fbml" xmlns:og="http://ogp.me/ns#"> <!--<![endif]-->
<head>
<title><?php echo $this->title;?></title>


<meta charset="utf-8" />
<meta name="author" content="Kouzma" />
<meta http-equiv="content-language" content="<?php echo Service_Translate::getLang();?>" />
<?php if ($this->isNoIndex) echo '<meta name="robots" content="noindex" />'; ?>
  	<?php 
	  if (isset($this->keywords))	echo '<meta name="keywords" content="' . $this->keywords . '" />';
	  if (isset($this->description)) echo '<meta name="description" content="' . $this->description . '" />';
	  if ($this->canonical && $this->canonical != preg_replace("|" . W_ABSPATH . "|", W_FULLPATH, @$_SERVER['REQUEST_URI'], 1)) echo '<link rel="canonical" href="' . $this->canonical . '" />';

	  foreach ($this->arrAdditional as $additional) echo $additional;
	  	
	  if (SHOW_ANALYTICS) echo '
			<script type="text/javascript">
  			window.qbaka||function(e,t){var n=[];var r=e.qbaka=function(){n.push(arguments)};e.__qbaka_eh=e.onerror;e.onerror=function(){r("onerror",arguments);if(e.__qbaka_eh)try{e.__qbaka_eh.apply(e,arguments)}catch(t){}};e.onerror.qbaka=1;r.sv=2;r._=n;r.log=function(){r("log",arguments)};r.report=function(){r("report",arguments,new Error)};var i=t.createElement("script"),s=t.getElementsByTagName("script")[0],o=function(){s.parentNode.insertBefore(i,s)};i.type="text/javascript";i.async=!0;i.src=("https:"==t.location.protocol?"https:":"http:")+"//cdn.qbaka.net/reporting.js";typeof i.async=="undefined"&&t.addEventListener?t.addEventListener("DOMContentLoaded",o):o();r.key="657b63818177c6f8b776ebd39b0e1c87"}(window,document);qbaka.options={autoStacktrace:1,trackEvents:1};
  		</script>
    ';
	  
	  //echo Service_Generate::generateJsCssTags($this->cssJsDescription, $this, $this->cssExclude);
	  foreach ($this->arrCss as $cssFile)	echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . $cssFile . '" />';
	  //foreach ($this->arrJs as $jsFile) echo '<script type="text/javascript" src="' . W_JS . $jsFile . '"></script>' . "\n";		
		
		echo '<script type="text/javascript">';
		
		//if(!NO_JS_CSS_MERGE) ob_start();
		echo 'var isDebug = ' . (intval(isset($_GET['debug']))) . ';';
		
		//if(!NO_JS_CSS_MERGE) {
			//$packer = new JavaScriptPacker(ob_get_clean(), 0);
			//echo $packer->pack();
		//}
		
		echo '</script>';
		?>

		</head>
<body <?php echo $this->bodyAttrs;?> class="<?php echo Service_Translate::getLang() . ' ';?><?php if (!empty($this->bodyClass)) echo $this->bodyClass . ' '; ?>_<?php echo $this->bodyControllerName . (!empty($this->bodyActionName) ? ' __' . $this->bodyActionName : null);?>">
<?php if (isset($this->beforeFull)) echo $this->beforeFull;?>
<div id="full">
		<?php if (!empty($this->beforeAll)) echo $this->beforeAll;?>
		<?php if (!empty($this->beforeFunction)) call_user_func(array($this, $this->beforeFunction)); ?>
		<div id="all">
			<div id="allIn">
		<?php
	}
	
  /**
   * Метод добавляет css файл к общему массиву
   *
   * @param string $cssFileName
   */
	public function addCss($cssFileName) {
  	$this->arrCss[] = $cssFileName;
  }
  
  /**
   * Метод добавляет js файл к общему массиву
   *
   * @param string $jsFileName
   */
	public function addJs($jsFileName) {
  	$this->arrJs[] = $jsFileName;
  }

  /**
   * Метод добавляет js файл в начало общего массива
   *
   * @param string $jsFileName
   */
	public function addJsToBegin($jsFileName) {
  	$this->arrJs = array_merge(array($jsFileName), $this->arrJs);
  }
  /**
   * Метод добавляет очередную хлебную крошки к общему массиву
   *
   * @param string $arrCrumb
   */
	public function addCrumb($name, $url = null, $noLinkIfLast = false, $isNoindex = false) {
  	$arrCrumb = array();
  	$arrCrumb['name'] = $name;
  	$arrCrumb['url'] = $url;
  	$arrCrumb['no_link_if_last'] = $noLinkIfLast;
  	$arrCrumb['is_noindex'] = $isNoindex;
	  $this->arrCrumbs[] = $arrCrumb;
  }
  /**
   * Метод устанавливает хлебные крошки
   *
   * @param string $arrCrumbs
   */
	public function setCrumbs($arrCrumbs) {
  	$this->arrCrumbs = $arrCrumbs;
  }
  /**
   * Метод добавляет доплнительный код в метатеги
   *
   * @param string $additional
   */
	public function addAdditional($additional) {
  	$this->arrAdditional[] = $additional;
  }
  /**
   * Метод задает js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
	public function setJsReady($jsReadyText) {
  	$this->jsReady = $jsReadyText;
  }

  /**
   * Метод добавляет js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
  public function addJsReady($jsReadyText) {
    if (!isset($this->jsReady)) $this->jsReady = $jsReadyText;
    else $this->jsReady .= $jsReadyText;
  }

  /**
   * Метод закрывает html-код
   *
   */
	public function showClose() {
	  Service_Debug::setDebug();
	  if ($this->showAnalytics  && SHOW_ANALYTICS) {
			$this->showAnalytics();
    }
    else {
			?>
    	<script type="text/javascript">
				ga = function(var1, var2,var3) {console.log('!!!!',var1,var2, var3);}
			</script>
			<?php 
    }
	  /*if (User_User::getId() == 1) {
    	echo '<!-- RedHelper -->
			<script id="rhlpscrtg" type="text/javascript" charset="utf-8" async="async"
				src="http://web.redhelper.ru/service/main.js?c=slamer"></script>
			<!--/Redhelper -->';	
    }*/
    if (DEBUG) {
    	$objDebug = Service_Debug::instance();
			$objDebug->echoDebug();
			
    }
    echo '<script>var time = ' . Pressure::calculateCurrentDuration('main') . '</script>';
    echo '<script>startTime = new Date();</script>';
    echo '<script>isLoggedIn = ' . intval(!!User_User::getId()) . ';</script>';
    echo '<script>
  		var today = new Date();
			timeZone = -today.getTimezoneOffset() / 60;	
  	</script>';
    if (isset($_GET['stmt']) && SimpleAdministration::isAdmin()) {
			echo 'stmt count: ' . Service_Database::getStmtCount() . "<br />\n";
		}
		if (!empty($this->arrOstProperties)) {
			echo '
			<script type="application/ld+json"> {
		     "@context":"http://schema.org",
		     "@type" : "WebFormHandler",
		     "specificationUrl" : "' . W_FULLPATH . 'hotels.xml",
		
		     "defaultProperty" : [';
			$i = 0;
			foreach ($this->arrOstProperties as $name => $value) {
				if ($i++) echo ',';
		       echo '{
		          "@type" : "FormProperty",
		          "name" : "' . $name . '",
		          "defaultValue" : "' . $value . '"
		       }';
			}
		    echo ']
			}
			</script>
			';
		}
	
    //echo '<script src="'. W_JS . 'generic/immediate-context.js?_=' . filemtime(ABSPATH . 'content/js/generic/immediate-context.js') . '"></script>';
    $this->needEMail(); // Проверяем нужно ли запросить E-Mail пользователя
    echo '</body>';
		echo '</html>';
	}


	/**
	 * Выводит шапку
	 * 
	 * @param $metas - Текст MEAT-тегов
	 * @param $rightBlock - Текст правого блока
	 */
	public function showHeader($metas = null, $rightBlock = null) {
	  $this->showUserMessages();
	  // вывод метатегов
		if ($metas) echo $metas;
		else $this->showMetas();    
		
		// Вывод хлебных крошек
		if ($this->showCrumbsInStandardPlace) {
			$this->showCrumbs();
		}
		
		// вывод основного заголовка
		if ($this->pageHead != '') {
			$this->showH1($this->pageHead);
		}
		
		if (!empty($this->callBackFunction)) {
			if($this->callBackFunction instanceof Closure) {
				$closure = $this->callBackFunction;
				$closure($this->callBackValue);
			}
			else call_user_func(array($this, $this->callBackFunction), $this->callBackValue);
		}
		// Вывод боковых столбцов и
		if ($this->showLeftColumn) $this->showLeft();
		if ($this->showRightColumn) {
			if ($rightBlock) echo $rightBlock;
			else $this->showRight();
		}
		
		// Вывод основного дива в зависимости от наличия боковых столбцов
		if ($this->showLeftColumn && $this->showRightColumn) echo '<div id="main">';
		elseif (!$this->showLeftColumn && $this->showRightColumn) echo '<div id="mainWithLeft">';
		elseif ($this->showLeftColumn && !$this->showRightColumn) echo '<div id="mainWithRight">';
		else echo '<div id="mainFullWidth">';
		
		if (!$this->showCrumbsInStandardPlace && $this->showCrumbsInContent) $this->showCrumbs();
		
		// вывод сообщения об ошибке
		$this->showErrorMessages();
  }
  
  protected function showUserMessages() {
//   	if (!$this->showUserMessagesInStandardPlace) {
//   		if (User_Flash::_get('successMessage')) $messageClass = 'successMessage';
//   		if (User_Flash::_get('errorMessage')) $messageClass = 'errorMessage';
//   		if (!empty($messageClass)) {
//   			$this->addJsReady("
//   					$('#" . $messageClass . "').dialog({
//   					width: 600,
//   					height: 450,
//   					position: 'center',
//   					modal: true
//   		});");
//   		}
//   	}
  }
  
  protected function showErrorMessages() {
  	if ($this->showUserMessagesInStandardPlace) {
  		if (User_Flash::_get('successMessage')) View_User::showUserMessage(User_Flash::_get('successMessage'), 1);
  		if (User_Flash::_get('errorMessage')) View_User::showUserMessage(User_Flash::_get('errorMessage'), -1);
  	}
  	else {
  		if (User_Flash::_get('successMessage')) {
  			echo '<div id="successMessage" style="display:none;">' . User_Flash::_get('successMessage') . '</div>';
  		}
  		if (User_Flash::_get('errorMessage')) {
  			echo '<div id="errorMessage" style="display:none;">' . User_Flash::_get('errorMessage') . '</div>';
  		}
  	}
  }

  /**
   * Метод выводит стандартный заголовок
   *
   * @param string $pageHead
   * @param string $editUrl
   */
  public function showH1($pageHead = null, $editUrl = null, $addUrl = null) {
	  Service_Debug::setDebug();
	  if(empty($pageHead)) $pageHead = $this->pageHead;
	  $h1Class = null;
	  
	  //convert using objMicroData
	  if((string)($this->objMicroData)) {
	  	if ($this->objMicroData->name && strpos($pageHead, $this->objMicroData->name) !== false) {
				$h1Class = 'item';
				$pageHead = str_ireplace($this->objMicroData->name, '<span class="fn"' . $this->objMicroData->prop('name') . '>' . $this->objMicroData->name . '</span>', $pageHead);
	  	}
	  }
	  
	  if(empty($editUrl)) $editUrl = $this->editUrl;
	  if(empty($addUrl)) $addUrl = $this->addUrl;
	  echo '<h1' . ($h1Class ? ' class="' . $h1Class . '"' : null) . '>';
	  	echo $pageHead;
	    if (!empty($editUrl)) echo ' (<a href="' . $editUrl . '">' . Service_Translate::getText('Редактировать') . '</a>)';
	    elseif(!empty($addUrl)) echo ' (<a href="' . $addUrl . '">' . Service_Translate::getText('Добавить') . '</a>)';
	  echo '</h1>';
	  if(!empty($this->pageDescription)) echo '<h3 class="col-2">' . $this->pageDescription . '</h3>';	  
  }
  
    /**
   * Метод выводит хлебные крошки
   *
   */
  public function showCrumbs() {
    Service_Debug::setDebug();
    //$objViewBlock = new View_Block();
    //$objViewBlock->showCrumbs($this->arrCrumbs, $this->ifLastCrumbIsLink);
  }

  /**
   * Выводит подвал
   *
   */
  public function showFooter() {
    	echo '</div>'; // Закрываем div из header (mainWithLeft/mainWithRight/mainFullWidth)
  	echo '<div class="clear"></div>';
  	echo '</div>';// Закрываем <div id="allIn">
  	echo '</div>'; // Закрываем <div id="all">
  	echo '<div id="footerHeight"></div>';	
  	echo '</div>'; // Закрываем <div id="full">
  	
  	$this->showClose();
  }

  /**
   * Выводит верхнюю часть
   *
   */
  public function showTop() {
    Service_Debug::setDebug();
    
    $objWasWill = new WasWill();
    $arrWasWill = $objWasWill->getCntHotelOnUser();
    $objViewBlock = new View_Block();
    
    $noindexSlogan = !($this->arrRequest[0] == '');
    
    $objViewBlock->showTop($arrWasWill, $noindexSlogan, $this->_alternativeLangUrl);
   // $objViewBlock->showMainMenu(array());
  }

  /**
   * Выводит нижнюю часть
   *
   */
  public function showBasement() {
    Service_Debug::setDebug();
    $objViewBlock = new View_Block();
    $objViewBlock->showBasement($this->showPrebasement);
  }
  
  public function showAnalytics() {
  ?>
<div data-role="page" id="analitics" style="display: none;">

<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  
ga('create', 'UA-431679-3', {
  'siteSpeedSampleRate': 10
});
ga('require', 'displayfeatures');
<?php 
foreach ($this->_arrGaParams as $paramId => $value) {
	echo "ga('set', 'dimension" . $paramId . "', '" . $value . "');";
}
?>
ga('send', 'pageview', {
	'dimension1':  '<?php echo (Experiment::metaSearchAndOstrovokExperiment()); ?>',
	'dimension7':  '<?php echo (Experiment::getHttpsVariant()); ?>'
});

</script>


<!-- Yandex.Metrika counter -->
<script type="text/javascript">
(function (d, w, c) {
    (w[c] = w[c] || []).push(function() {
        try {
            w.yaCounter7763785 = new Ya.Metrika({id:7763785,
                    webvisor:true,
                    clickmap:true,
                    trackLinks:true,
                    accurateTrackBounce:true});
        } catch(e) { }
    });

    var n = d.getElementsByTagName("script")[0],
        s = d.createElement("script"),
        f = function () { n.parentNode.insertBefore(s, n); };
    s.type = "text/javascript";
    s.async = true;
    s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";

    if (w.opera == "[object Opera]") {
        d.addEventListener("DOMContentLoaded", f, false);
    } else { f(); }
})(document, window, "yandex_metrika_callbacks");
</script>
<noscript><div><img src="//mc.yandex.ru/watch/7763785" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->

<?php /*
			<!-- Yandex.Metrika counter -->
			<div style="display: none;">
				<script type="text/javascript">
(function(w, c) {
    (w[c] = w[c] || []).push(function() {
        try {
            w.yaCounter7763785 = new Ya.Metrika({id:7763785, enableAll: true, webvisor:true});
        }
        catch(e) { }
    });
})(window, "yandex_metrika_callbacks");
</script>
			</div>
			<script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript"
				defer="defer"></script>
			<noscript>
				<div>
					<img src="//mc.yandex.ru/watch/7763785"
						style="position: absolute; left: -9999px;" alt="" />
				</div>
			</noscript>
			<!-- /Yandex.Metrika counter -->
*/?>
</div>
<?php 
  }

  /**
   * Выводит левую часть
   *
   */
  public function showLeft() {
  	echo '<div id="left">';
      echo 'Левое меню';
  	echo '</div>';
  }


  /**
   * Выводит правую часть
   *
   */
  public function showRight() {
    	$objViewBlock = new View_Block();
  	echo '<div id="right">';
      //$objViewBlock->showSocialButtonsBlock();
      //$objViewBlock->showTopClientBanner();
      $objViewBlock->showGroupBookingBanner();
      //echo '<div class="theSimplestBorder alignCenter">' . Service_Translate::getText('По вопросам рекламы') . '</div>';
  	echo '</div>';
  }

	/**
	 * Метод выводит сообщение об ошибке
	 *
	 */
	public function showError() {
		if ($this->error == 404 && Service_Function::spiderDetect()) return false; // Не сохраняем ботов
		if (substr(@$_SERVER['REQUEST_URI'], 0, 26) == '/image.hotels1.cdnvideo.ru') User_Session::moveTo('http:/' . $_SERVER['REQUEST_URI']);
		$objError = new Error();
		$objError->setFields(array('error_name' => 'Site error ' . $this->error, 'error_text' => $_SERVER['REQUEST_URI']));
		$objError->save();
		if (isset($_SERVER['HTTP_REFERER']) && preg_match('#pegast\.ru#', $_SERVER['HTTP_REFERER'])) User_Session::moveTo(W_ABSPATH);
		$objViewBlock = new View_Block();
		switch ($this->error) {
			case 404:
				header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
				$this->pageHead = $this->title = Service_Translate::getText('Такая страница не существует.');
				$objViewBlock->errorPage('404');
				exit();
				break;
			case 403:
				header($_SERVER["SERVER_PROTOCOL"]." 403 Forbidden");
				$this->pageHead = $this->title = Service_Translate::getText('Недостаточно прав для просмотра страницы.');
				$objViewBlock->errorPage('403');
				exit();
				break;
			case 503:
				header($_SERVER["SERVER_PROTOCOL"]." 503 Service Unavailable");
				$this->pageHead = $this->title = Service_Translate::getText('Сервис временно недоступен.');
				$objViewBlock->errorPage('503');
				exit();
				break;
			default:
				$this->pageHead = $this->title = Service_Translate::getText('Произошла неизвеcтная ошибка.');
				break;
		}
		$this->showRightColumn = false;
		$this->showLeftColumn = false;
		$this->showAnalytics = false;
		
    $this->showHeader();
		$this->showFooter();
	}


	/**
	 * Метод проверяет авторизацию пользователя и передает в js функцию
	 *
	 */
	public function addMetasForLogInCheck() {
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if ($userId) $loggedIn = 1;
		else $loggedIn = 0;
		$this->addJsReady('user.logInCheck({"loggedIn": ' . $loggedIn . '});');
	}

  /**
   * Формирует url без GET параметров
   *
   * @return string
   */
  public function getCurrentUrl() {
    $urlBeforePageNummber = W_ABSPATH;
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) {
      foreach ($this->arrRequest as $urlWord) {
        if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
      }
    }
    return $urlBeforePageNummber;
  }
  
	/**
	 * Метод выводит блок постраничного листания
	 */
	public function showPages($clearSlash = false, $newDesign = 0, $clear = false) {
    $urlBeforePageNummber = W_ABSPATH;
    $urlAfterPageNummber = '';
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) foreach ($this->arrRequest as $key => $urlWord) {
    	if ($key == 0 && $urlWord == 'hms') {
    		$urlBeforePageNummber = W_HOTEL_ADMIN;
    		continue;
    	}
    	if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
    }
    
    if ($clearSlash) $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strlen($urlBeforePageNummber) - 1); 
	$clearUrl = $urlBeforePageNummber;
    if (!$this->pageUrlsInGet) { //Если номер страницы нужно передавать не через "?", а через /123/
      $urlAfterPageNummber = '/';
      if (!empty($_SERVER['QUERY_STRING'])) {
        $urlAfterPageNummber .= '?' . $_SERVER['QUERY_STRING'];
      }
      if ($this->isPageInUrl) {
        $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strlen($urlBeforePageNummber) - 1);
        $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strrpos($urlBeforePageNummber, '/') + 1);
      }
    }
    else { // Если номер страницы нужно передавать в GET, через "?"
      $urlBeforePageNummber .= '?';
      if (strpos($_SERVER['QUERY_STRING'], 'p=') === 0) { // Если среди GET параметров в самом начале стоит p=
        $urlBeforePageNummber .= 'p=';
        if (strpos($_SERVER['QUERY_STRING'], '&', 2)) $urlAfterPageNummber = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&', 2));
      }
      else { // Если в начале GET параметров не стоит p=
        $pagePosInGet = strpos($_SERVER['QUERY_STRING'], '&p=');
        if ($pagePosInGet === false) { // Если в GET параметрах вообще отсутствует "p="
          $urlBeforePageNummber .= 'p=';
          $urlAfterPageNummber = '&' . $_SERVER['QUERY_STRING'];
        }
        else { // Если в GET параметрах  "p=" стоит в середине или конце
          $urlBeforePageNummber .= substr($_SERVER['QUERY_STRING'], 0, $pagePosInGet + 3);
          if (strpos($_SERVER['QUERY_STRING'], '&', $pagePosInGet + 1)) $urlAfterPageNummber = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&', $pagePosInGet + 1));
        }
      }
    }
    $pagesAmount = ceil($this->elementsInListAmount / $this->pageLimit);
    View_Pager::getPages($urlBeforePageNummber , $pagesAmount, $this->pageNum, '', $urlAfterPageNummber, $this->elementsInListAmount, $clearUrl, $newDesign);
    if ($clear) echo '<div class="clear"></div>';
	}

  /**
   * Метод устанавливает текущий язык работы сайта
   * 
   * @param string $language - трехбуквенное сокращение языка
   */
  public function setLanguage($language) {
    $this->language = $language;
  }

  /**
   * Метод добавляет js и css файлы для работы редактора WYSIWYG
   *
   */
	public function addWysiwygMetas() {

		$this->arrCss[] = 'elrte.min.css';
		$this->arrCss[] = 'elfinder.css';
		
		$this->arrJs[] = 'elrte.min.js';
		$this->arrJs[] = 'i18n/elrte.ru.js';
		$this->arrJs[] = 'elfinder.min.js';
		$this->arrJs[] = 'elfinder_start.js';
  }
  				
	/**
	 * Добавляет JS для работы календаря
	 * 
	 * @param string $dateArr - Дата заезда в формате 30/12/2012 
	 * @param string $dateDep - Дата выезда в формате 31/12/2012
	 */
	public function addJsReadyForCalendar($dateArr = null, $dateDep = null) {
		return;
		
		list($dateArr, $dateDep) = array_values(HotelSearch::getSearchDate($dateArr, $dateDep));
	  if ($dateArr && $dateDep) {
		  $this->addJsReady("
		  	$('.calendar-text').rangeCalendar({
		  		imageUrl: '" . W_IMAGES . "icons/cal_w.png',
		  		imageClass: 'calendar-ico',
					rangeBegin: Date.fromString('" . $dateArr . "', true),
					rangeEnd: Date.fromString('" . $dateDep . "', true),
		  			position: {
		  				my: 'left top',
						at: 'left bottom'
		  			},
		  			onShow: function(){
		  				this.attr('title', '').data('ui-tooltip-title', null).trigger('mouseout');
		  				this.find('td.ui-state-active.highlight').eq(0).addClass('light');
		  				this.find('td.ui-state-active.highlight').eq(-1).addClass('light');
	  				},

					onRangeSelectEnd: function(rangeStart, rangeEnd){
				  		if (rangeEnd.getTime() - rangeStart.getTime() > 30 * 24 * 3600 * 1000) {
			        		alert(arrLang['Диапазон дат должен быть меньше 30 дней']);
		  					return false;
		  				}
		  		
		  				$('.date_arr').val($.datepicker.formatDate('dd/mm/yy', rangeStart));
		  				$('.date_dep').val($.datepicker.formatDate('dd/mm/yy', rangeEnd));
	  				},
				  	onDateFormat: function() {
						return $.datepicker.formatDate('dd', this) + ' ' + this.getMonthName('fullNum');
					},
			  		onTableCellHover: function(state, selectionState) {
		  				
		  				if(iPhone) return;
		  		
		  				var td = $(this);
		  		
		  				td.closest('.ui-datepicker').find('.date-arr-dep-helper').remove();
		  				
						if(state == 'over') {
				
							var hlp = $('<div/>');
				
							hlp.addClass('date-arr-dep-helper ui-tooltip ui-widget ui-corner-all ui-widget-content')
								.html(selectionState == 1 ? _('Установить дату выезда') : _('Установить дату заезда'))
								.css({
		  						position: 'absolute',
		  							left: 0,
									top: 0
								})
								.appendTo(td)
								.position({
									my: 'center bottom-10',
									at: 'center top',
									of: td,
									collision: 'fit flip'
								})
								.stem({
									position: 'bc',
									alignTo: td
								});
							
						}
			  		}
				});

			");
	  }    	
  }
  
  /**
   * Выводим все что нужно чтобы запросить у пользователя E-Mail
   */
  public function needEMail() {
  	if (isset($_COOKIE['need_e_mail'])) {
			View_Auth::showNeedEMailForm();
  	}
  }

  /**
   * Устанавливает ошибку в контроллере
   * 
   * @param int $errorCode - Код ошибки
   */
  public function setError($errorCode) {
    	$this->error = $errorCode;
  }
  
  /**
   * Устанавливаем новый title 
   * 
   * @param string $title - новый тайтл
   */
  public function setTitle($title) {
    	$this->title = $title;
  }
  
  /**
   * Устанавливаем данные для работы эксперимента
   * 
   * @param int $pageType - Тип страницы
   * @param array $arrEssences - Список сущностей
   */
  public function setExperiment($pageType, array $arrEssences) {
		$variantId = Experiment::getExperimentVariant($pageType, $arrEssences);
		$this->bodyAttrs .= ' data-page-type="' . $pageType . '" data-variant-id="' . $variantId . '"';
		return $variantId;
  }
  
  /**
   * Добавляем атрибуты для body
   * 
   * @param string $attrs - Аттрибуты
   */
  public function addBodyAttrs($attrs) {
  	$this->bodyAttrs .= $attrs;
  }
  
  /**
   * Возвращает лимит сущностей на страницу текущего контроллера
   * 
   * @return number - число сущностей на странице
   */
  public function getPageLimit() {
		return $this->pageLimit;
  }
  
  /**
   * Проверяем является страница первой у человека
   * 
   * @param unknown $param
   */
  protected function _isNewVisitor() {
  	$url = Service_Function::getValue('', $_SERVER, 'HTTP_REFERER');
		if (empty($url)) return true;
		if (substr($url, 0, 4) == 'http') $url = substr($url, strpos($url, '/') + 2);
		if (preg_match('#^' . SITE_URL . '#', $url)) return false;
		return true; 
  }
  
}